package laboratorio5;

/**0
 *
 * @author ROGER DIAZ Y RODIMIRO CASTANEDA
 * Desripcion: esta clase va a ir creando los nodos de lista, se crea una cabeza, esta trabaja solamente como una referencia para tener
 * direcciones y empezar la secuencia en la cual se le da el valor de direccion al nodo anterior al obtenerlo porque se creo un nodo
 * //delante de el.
 */
public class Lista implements iLista {
    //ATRIBUTOS
    protected int cantNodos;
    protected NodoLista head;
    
    //CONSTRUCTOR
    public Lista(){ //Esto seria para generar la lista vacia.
    head=null;
    cantNodos=0;
    }
    
    //ESTA CLASE ESTA HECHA GRACIAS A LA GUIA QUE SE PRESTA EN EL CAPITULO 9 DEL LIBRO UTILIZADO EN LA CLASE
      //Bailey, D. 2007. Java Structures, Cap 9: List. Williams Collage. Estados Unidos de America. Pp 542
    
    public int largo(){
       // esto me dice cuantos nodos se le han hecho a la lista
    return cantNodos;
    }
    
    
    
     //esto es como hacer un addLast del libro
    public void pusht(String nuevovalor){
        //se crea el nodo y en las condiciones de abajo solo se mira si se mete como cabeza despues del ultimo nodo que haya.
        NodoLista temp=new NodoLista(nuevovalor, null);
        if(head!=null){
            NodoLista finger=head;//para ver en la lista que nodo trabajamos
            while(finger.siguiente()!=null){//si existe
                                            //consigo el final
                finger=finger.siguiente();
            }
            finger.setPuntero(temp);
        }else 
        {
            head=temp;
        }
        cantNodos++;//actualizo contador
    }
 
    //REMOVE LAST
         //esto es como hacer un pop manual
     public String popt(){
         //con el finger voy a llegar hasta el tope
        NodoLista finger=head;
        //este guarda el anterior al finger entonces cuando finger llegue al tope
        //a este anterior le hago null el puntero para deshacerme del ultimo
        NodoLista anterior= null;
        String value=null;
        try{
        if(cantNodos==1){
            value=finger.getValor();
            head=null;
            cantNodos--;
        }
        
        if (cantNodos>=2){     
        while(finger.siguiente()!=null){//si existe una direccion
                anterior=finger;
             finger=finger.siguiente();
            }
        //tomo el valor del ultimo antes de quitarlo
            value=finger.getValor();
            anterior.setPuntero(null);
            cantNodos--;
        }
        
        }
        catch(Exception e){}
            return value;
               
        }
    
     
     //CONTAINS
        //con esto se mira si existe el valor que se desee saber
    public boolean contiene(String value){
        //reviso el valor con el finger que va a ir cambiando
    NodoLista finger = head;
    while(finger!=null && !finger.getValor().equals(value)){
    finger=finger.siguiente();
    }
    return finger!=null;
}
      
       
    //esto sirve para quitar el valor deseado
    public String removerAlguno(String prueba){
    NodoLista finger=head;
    NodoLista anterior=null;
    while(finger!=null && !finger.getValor().equals(prueba)){
    anterior=finger;
    finger=finger.siguiente();
    }
    if(finger!=null){
    if(anterior==null){
    head=finger.siguiente();
    }
    else{
    anterior.setPuntero(finger.siguiente());
    }
    cantNodos--;
    return finger.getValor();
    }
    return null;
    }
    
    
    //inicializa
    public void limpiar(){
    head=null;
    cantNodos=0;
    }
    
    public String imprimir(){
    String txt="";
    int Largo=cantNodos;
    //teniendo el largo de la lista voy a ir imprimiendo el valor uno por unno
    //el finger va a irse moviendo para imprimir lo que tenga en cada ocasion 
    NodoLista finger=head;
    for(int i=0; i<Largo; i++){
    System.out.println(finger.getValor());
    finger=finger.siguiente();
    }
    return txt;
    }
    
    
         //ver que hay de ultimo en la pila
    public String getUltimo(){
        //tomo el valor del nodo
        return head.getValor();
    }
    }